package com.stemaini.core.doc;

import com.stemaini.core.database.StopList;
import com.stemaini.core.database.Kamus;
import com.stemaini.utility.*;
import taini.koneksi.KoneksiAini;

/**
 * @author Putu Adhi Kerta Mahendra 5104 100 089
 * copyright(C) -  29 April 2008
 * Jurusan Teknik Informatika - ITS Surabaya
 */

public class Dokumen{
    private String idDok,           //id dokumen berita
                  isi;              //isi dokumen berita
    private Vektor vektor;          //representasi vektor kata2 dalam dokumen
    private StopList stoplist;      //list of stopLList..
    private KoneksiAini theKoneksi;     //objek koneksi ke database
    private Kamus kamus;
    private Terms terms;
    private boolean isUsingStoplist;
    
    /**
     * Konstruktor Dokumen(String id, String judul, String isi)
     * @param id 
     * @param judul
     * @param isi
     */
    public Dokumen(String idDok, String isi, Kamus kamus, Terms terms, 
            boolean isUsingStoplist) {
        this.idDok = idDok;
        this.isUsingStoplist = isUsingStoplist;
        this.isi = isi;
        this.kamus = kamus;
        this.terms = terms;
        this.theKoneksi = kamus.getKoneksi();
        stoplist = new StopList(this.theKoneksi);
        this.vektor = new Vektor(this.idDok,terms,kamus);
    }

    /**
     * String getIdDok()
     * untuk mendapatkan ID dokumen
     * @return ID Dokumen <string> 
     */
    public String getIdDok() {
        return idDok;
    }

    /**
     * String getIsi()
     * untuk mendapatkan isi dokumen
     * @return isi <String>
     */
    public String getIsi() {
        return isi;
    }
    public Vektor getVec()
    {
        return vektor;
    }
    /**
     * void setId(String idDok)
     * untuk mengeset parameter idDok
     * @param idDok <String>
     */
    public void setId(String idDok) {
        this.idDok = idDok;
    }

    /**
     * void setIsi(String isi)
     * untuk mengeset isi dokumen
     * @param isi <String>
     */
    public void setIsi(String isi) {
        this.isi = isi;
    }

  
    /**
     * isForbiddenChar(char kar)
     * @param kar
     * @return boolean TRUE jika kar!= 'a,b,...,y,z' || 'A,B,..,Y,Z' || spasi
     */
    private boolean isForbiddenChar(char kar)
    {
        if(kar >= 'a' && kar <= 'z' )     //termasuk a,b...,y,z diperbolehkan
            return false;
        else if(kar >= 'A' && kar <= 'Z') //termasuk A,B...,Y,Z diperbolehkan
            return false;
        else if(kar == ' ')               //termasuk karakter spasi diperbolehkan
            return false;
        
        return true;
    }

    /**
     * method doLowerCase()
     * - untuk me-lowwercase isi dokumen 
     * - merupakan step ke-2 intial document preprocessing.
     */
    public void doLowerCaseIsi()
    {
        this.isi = this.isi.toLowerCase();
        //System.out.println("-->" + this.isi);
    }
        
    /**
     * method doFiltering()
     * Berguna untuk melakukan filtering isi dokumen, sekaligus memecah 
     * kata-kata dalam isi dokumen tsb, & memasukkannya ke dalam 
     * linked list "term".  
     */
    public void doFiltering()
    {
        for(int i=0; i<this.isi.length(); i++)
        {
            if( isForbiddenChar(this.isi.charAt(i)) )
                this.isi = isi.substring(0,i) + " " + 
                        isi.substring(i+1,isi.length());
        }
        //System.out.println("===>" + this.isi);

    }
    
    /**
     * void doCountFreq()
     * untuk mengelompokkan term-term sekaligus menghitung frekuensi per terms.
     * pengelompokkan disimpan dalam atribut "listTerm"
     */
    public synchronized void doTermExtraction()
    {   //memasukkan ke linked list stem + menghitung frekuensinya
        String[] temp = isi.trim().split(" "); //kita split dgn regex = spasi
        for(int i=0; i<temp.length; i++)
        { //jika panjang kata>=2 maka baru dianggap sbg "KATA"
            //System.out.println("!!" + temp[i]);
            if(temp[i].length()>=2)
            {
                if(isUsingStoplist)
                {
                    if(!stoplist.isContain(temp[i])){
                        //System.out.println("xxlevel : "+i);
                        vektor.addTerm(temp[i],1);
                    }
                }
                else{
                    //System.out.println("level : "+i);
                    vektor.addTerm(temp[i],1);
                }
            }
        }
        //for (int i=0; i<vektor.getSize(); i++){
            //System.out.println(i + " " + vektor.getTermNodeKata(i));
            //System.out.println("///" + vektor.getTermNodeKata(1));
            //System.out.println("///" + vektor.getTermNodeKata(2));
        //}
    }
        
    /**
     * void doStemming()
     * untuk melakukan stemming tiap term yang ada pada atribut "listTerm" kelas
     */
    public synchronized void doStemming(int pilihanStemmer)
    {
        vektor.stemListTerm(pilihanStemmer);
        //System.out.println(vektor.toString());
        //for (int i=0; i<vektor.getSize(); i++){
            //System.out.println("+++" + vektor.getTermNodeKata(i));
            //System.out.println("///" + vektor.getTermNodeKata(1));
            //System.out.println("///" + vektor.getTermNodeKata(2));
        //}
    }
    
    public synchronized void doVektorExporting()
    {
        //vektor.exportToDbase();
        vektor.exportToDbaseAini();
    }
    
}
